package com.gosophia.metadataEngine.commons;


import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Document;
import org.hibernate.MappingException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.gosophia.metadataEngine.entity.DataSourceInfo;

/**
 * 该类用于通过指定数据源创建session工厂，并将制定的创建出的hbm.xml文件加载
 * @author mayue
 *
 */
public class SessionUtil {
    
   // public  static Session session;
    
    
    public static String LOCATION = SessionUtil.class.getProtectionDomain()
                                   .getCodeSource().getLocation().getFile()
                                   + "/../";
    
    public  static Map<String, SessionFactory> sessionFactorys = new HashMap<String,SessionFactory>();
    /**
     * 通过指定参数查看是否有指定名称的sessionFactory，若有则直接返回，若没有则创建并返回。并将指定的文件加载
     * @param dataSourceName:数据源名称
     * @param document：数据源xml文件
     * @param strXmls：要加载的hbm.xml
     * @return
     */
    public synchronized static SessionFactory getSessionFactory(String dataSourceName,Document document, List<String> strXmls) {
//        SessionFactory sessionFac = sessionFactorys.get(dataSourceName);
        
//        if (sessionFac == null) {
//            buildSessionFacAndReloadConfiguration(dataSourceName,document,strXmls);
//        }
        buildSessionFacAndReloadConfiguration(dataSourceName,document,strXmls);
        return sessionFactorys.get(dataSourceName);
    }
    /**
     * 根据dataSourceName获取相应的sessionFactory
     * @since 2011-4-28
     * @author wangxinbing
     */
    public  synchronized static SessionFactory getSessionFactory(String dataSourceName){
    	return sessionFactorys.get(dataSourceName);
    }
    
    /**
     *通过指定的参数创建sessionFactory
     * @param dataSourceName：重新创建的数据源名字
     * @param document：数据源文件
     * @param strXmls：需要加载的实体hbm文件
     */
    public synchronized static void buildSessionFacAndReloadConfiguration(String dataSourceName, Document document, List<String> strXmls) {

        Configuration config = new AnnotationConfigurationForDom4j().configure(document);
        for (String xml : strXmls) {
            // 解析动态生成的hbm文件
            try {
				config.addXML(xml);
			} catch (MappingException e) {
				e.printStackTrace();
			}
        }
        SessionFactory sf= config.buildSessionFactory();
        sessionFactorys.put(dataSourceName, sf);
    }
    
//    public static void main(String args[]){
//        DataSourceInfo dsi = new DataSourceInfo();
//        dsi.setDriverClass("oracle.jdbc.driver.OracleDriver");
//        dsi.setUrl("jdbc:oracle:thin:@dev:1521:gzTestDB");
//        dsi.setDialect("org.hibernate.dialect.Oracle10gDialect");
//        dsi.setUsername("wangxinbing");
//        dsi.setPassword("wangxinbing");
//        org.dom4j.Document doc = CreateXML.createDataSourceXml(dsi);
//        String s = CreateXML.changeDocToStr(doc);
//        SessionFactory sf = getSessionFactory("测试1",doc,new ArrayList());
//        System.out.println("sessionFactory:"+sf);
//        Session session = sf.openSession();
//        System.out.println("session"+session);
//    }

}
